package main

import (
	"encoding/json"
	"gitee.com/liyunyi/log-app/internal/model"
	"gitee.com/liyunyi/log-app/middleware"
	"gitee.com/liyunyi/log-app/pkg/util"
	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"net/http"
)

var db *gorm.DB

func InitDB() (err error) {
	dsn := "root:root@tcp(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"
	db, err = gorm.Open(mysql.Open(dsn))
	_, err = db.DB()
	return err
}

func main() {
	//初始化配置文件

	//初始化日志

	//初始化service

	//连接数据库  create database bubble;
	err := InitDB()
	if err != nil {
		panic(err)
	}
	//自动迁移
	db.AutoMigrate(&model.Todo{})

	//获取gin框架路由
	r := gin.Default()

	//配置html模板和静态资源
	r.LoadHTMLGlob("templates/*")
	r.Static("/static", "static")

	//配置中间件
	r.Use(middleware.LogHandler)

	//设置请求根路径
	r.GET("/", func(context *gin.Context) {
		context.Set("logTitle", model.Title_Todo)
		context.HTML(http.StatusOK, "index.html", nil)
	})

	//待办事项
	v1Group := r.Group("/v1")
	{
		//新增
		v1Group.POST("/todo", func(c *gin.Context) {

			//日志记录
			// 1.2：title 【请求处理方法中设置】
			// 1.3：business_type 【请求处理方法中设置】
			// 1.4：origin_value 【编辑方法中设置】
			// 1.5：value 【编辑方法中设置】
			// 1.19：description：描述信息 【请求处理方法中设置】

			c.Set("logTitle", model.Title_Todo)
			c.Set("logBusType", model.BusinessType_ADD)

			var todo model.Todo
			err := util.GetParameterFromContext(c, &todo)
			if err != nil {
				result := model.NewResponse(false, http.StatusBadRequest, err.Error(), nil)
				util.ResponseHandle(c.Writer, result)
			}
			if err = db.Create(&todo).Error; err != nil {
				result := model.NewResponse(false, http.StatusOK, err.Error(), nil)
				util.ResponseHandle(c.Writer, result)
			} else {
				result := model.NewResponse(true, http.StatusOK, "success", nil)
				util.ResponseHandle(c.Writer, result)
			}
		})
		//查询
		v1Group.GET("/todo", func(c *gin.Context) {
			//日志记录
			// 1.2：title 【请求处理方法中设置】
			// 1.3：business_type 【请求处理方法中设置】
			// 1.4：origin_value 【编辑方法中设置】
			// 1.5：value 【编辑方法中设置】
			// 1.19：description：描述信息 【请求处理方法中设置】

			c.Set("logTitle", model.Title_Todo)
			c.Set("logBusType", model.BusinessType_QUERY)

			var todo model.Todo
			err := util.GetParameterFromContext(c, &todo)
			if err != nil {
				result := model.NewResponse(false, http.StatusBadRequest, err.Error(), nil)
				util.ResponseHandle(c.Writer, result)
			}

			var todos []model.Todo
			if err = db.Find(&todos).Error; err != nil {
				result := model.NewResponse(false, http.StatusOK, err.Error(), nil)
				util.ResponseHandle(c.Writer, result)
			} else {
				result := model.NewResponse(true, http.StatusOK, "success", todos)
				util.ResponseHandle(c.Writer, result)
			}
		})
		v1Group.GET("/todo/:id", func(c *gin.Context) {

		})
		//修改
		v1Group.PUT("/todo/:id", func(c *gin.Context) {
			//日志记录
			// 1.2：title 【请求处理方法中设置】
			// 1.3：business_type 【请求处理方法中设置】
			// 1.4：origin_value 【编辑方法中设置】
			// 1.5：value 【编辑方法中设置】
			// 1.19：description：描述信息 【请求处理方法中设置】

			c.Set("logTitle", model.Title_Todo)
			c.Set("logBusType", model.BusinessType_UPDATE)

			var originTodo model.Todo
			var todo map[string]interface{}

			err := util.GetParameterFromContext(c, &todo)
			if err != nil {
				result := model.NewResponse(false, http.StatusBadRequest, err.Error(), nil)
				util.ResponseHandle(c.Writer, result)
			}

			if todo["id"] == 0 {
				result := model.NewResponse(false, http.StatusBadRequest, "id不存在", nil)
				util.ResponseHandle(c.Writer, result)
				return
			}

			if err = db.Where("id=?", todo["id"]).First(&originTodo).Error; err != nil {
				result := model.NewResponse(false, http.StatusOK, err.Error(), nil)
				util.ResponseHandle(c.Writer, result)
				return
			}

			dataOri, data := util.CompareModelAndMap(&originTodo, todo)
			oldMapStr, _ := json.Marshal(dataOri)
			newMapStr, _ := json.Marshal(data)
			c.Set("logOriginValue", string(oldMapStr))
			c.Set("logValue", string(newMapStr))

			if err = db.Model(&model.Todo{}).Where("id=?", todo["id"]).Updates(data).Error; err != nil {
				result := model.NewResponse(false, http.StatusOK, err.Error(), nil)
				util.ResponseHandle(c.Writer, result)
			} else {
				result := model.NewResponse(true, http.StatusOK, "success", nil)
				util.ResponseHandle(c.Writer, result)
			}
		})
		//删除
		v1Group.DELETE("/todo/:id", func(c *gin.Context) {
			//日志记录
			c.Set("logTitle", model.Title_Todo)
			c.Set("logBusType", model.BusinessType_UPDATE)

			var todo model.Todo
			err := util.GetParameterFromContext(c, &todo)
			if err != nil {
				result := model.NewResponse(false, http.StatusBadRequest, err.Error(), nil)
				util.ResponseHandle(c.Writer, result)
			}
			if todo.Id == 0 {
				result := model.NewResponse(false, http.StatusBadRequest, "id不存在", nil)
				util.ResponseHandle(c.Writer, result)
				return
			}
			if err = db.Where("id=?", todo.Id).First(&todo).Error; err != nil {
				result := model.NewResponse(false, http.StatusOK, err.Error(), nil)
				util.ResponseHandle(c.Writer, result)
				return
			}
			if err = db.Where("id=?", todo.Id).Delete(model.Todo{}).Error; err != nil {
				result := model.NewResponse(false, http.StatusOK, err.Error(), nil)
				util.ResponseHandle(c.Writer, result)
			} else {
				result := model.NewResponse(true, http.StatusOK, "success", nil)
				util.ResponseHandle(c.Writer, result)
			}
		})
	}

	//启动
	r.Run()
}
